package com.fingard.dsp.bank.directbank.hxb01;

import java.sql.Connection;
import java.text.MessageFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import com.fingard.FGBiz;
import com.fingard.constant.Format;
import com.fingard.db.JDBCHelper;
import com.fingard.dsp.bank.directbank.bankInterface.IElecBillQuery;
import com.fingard.dsp.bank.reqrespobj.elecbillquery.*;
import com.fingard.dsp.bank.reqrespobj.elecbillquery.detail.*;
import com.fingard.text.StringHelper;
import com.fingard.util.DateHelper;

/**
 * Created by F on 2018/12/21.
 */
public class HXB01ElecBill extends HXB01Base implements IElecBillQuery {

    private static final String SELECTSEQ = "SELECT BANKREQSEQID FROM REQSEQIDMAPPING WHERE REQSEQID=?;";

    /**
     * 可操作票据查询
     */
    @Override
    public RetAtsB001OperBillQry D_OperBill_Query_Req(ReqB001OperBillQry query) throws  Exception{
        RetAtsB001OperBillQry retAts =  new  RetAtsB001OperBillQry(query.reqHeader);
        String respCode ="";
        String respInfo ="";
        retAts.respCode = "0";
        retAts.respInfo  = "";
        retAts.writeBefore();
        try{
            while (query.readRecord()) {
                int tmpNowReadStart = 1;//起始页数
                int tmpNowReadNum = 0;//已查询笔数
                Map<String, Integer> tmpTotalNum = new HashMap<String, Integer>();
                while (tmpNowReadNum == 0 || tmpNowReadNum < tmpTotalNum.get("recordCount")) {
                    //请求字段名
                    StringBuilder stringBuilder = new StringBuilder();
                    for (int i = 0; i < 21; i++) {
                        stringBuilder.append("{" + i + "}#");
                    }
                    stringBuilder.append("@@@@");
                    //请求字段值
                    String[] body = new String[21];
                    body[0] = "B308001";//交易代码
                    body[1] = query.detail.billNo;//电子票据号码
                    body[2] = "";//序号
                    body[3] = getBankConfig().getMapValueByKey("billTypeMapping", query.detail.billType);//票据类别
                    //系统自动提示承兑
                    if("2".equals(query.detail.busiType)){
                        retAts =  new  RetAtsB001OperBillQry(query.reqHeader);
                        retAts.respCode = "0";
                        retAts.respInfo = "系统自动提示承兑，请等待";
                        retAts.writeBefore();
                        break;
                    }
                    body[4] = tradeTypeChange(query.detail.busiType,query.detail.recourseType);//交易类型
                    String businessType="0";
                    switch (Integer.parseInt(query.detail.queryType)){
                        //0:出票类 查所有
                        case 1:businessType="1";break;//1:签收类
                        case 2:businessType="2";break;//2．需回复类 ?
                        case 3:businessType="3";break;//3．可做撤销类
                        default:throw new Exception("查询类型异常");
                        //------------------------------4.对方已签收类
                    }
                    body[5] = businessType;//业务种类
                    body[6] = bankFront.corpNo;//客户号
                    body[7] = query.detail.actNum;//客户账号
                    body[8] = "";//协议号码
                    body[9] = "";//出票人姓名
                    if(StringHelper.hasAnyChar(getBankConfig().getValueAsString("timeSection"))){
                        String[] times=getBankConfig().getValueAsString("timeSection").split("-");
                        body[10]= DateHelper.convertD8toD10(times[0]);
                        body[11]=DateHelper.convertD8toD10(times[1]);
                    }else {
                        body[10] = "";//出票起始日
                        body[11] = "";//出票截止日
                    }
                    body[12] = query.detail.dueDateDown;//到期起始日
                    body[13] = query.detail.dueDateUp;//到期截止日
                    body[14] = "";//票据状态
                    body[15] = query.detail.billAmtUp;//金额上线
                    body[16] = query.detail.billAmtDown;//金额下线
                    body[17] = "";//批次号码
                    body[18] = query.detail.billNo;//电票流水号码
                    body[19] = tmpNowReadStart + "";//页码
                    body[20] = getBankConfig().getValueAsString("pageSize");//每页条数
                    //请求报文
                    String sendInfo = MessageFormat.format(stringBuilder.toString(), body[0], body[1], body[2], body[3], body[4], body[5], body[6], body[7]
                            , body[8], body[9], body[10], body[11], body[12], body[13], body[14], body[15], body[16], body[17], body[18], body[19], body[20]);
                    //请求银行
                    String[] tmpStrRet = sendToBank(sendInfo);
                    if (tmpStrRet[0].length() == 0) {
                        //返回码
                        String[] resultArr = tmpStrRet[1].trim().replaceAll("@","").replaceAll("\r","")
                                .replaceAll("\n","").split("#");
                        if ("000000".equals(resultArr[0])) {
                            //记录查询返回总数
                            if (tmpTotalNum.containsKey("recordCount")) {
                                if (tmpTotalNum.get("recordCount").intValue() != Integer.valueOf(resultArr[1]).intValue()) {
                                    respCode="-1";
                                    respInfo="相同条件前后查出来的总数不一致";
                                    break;
                                }
                            } else {
                                if ("0".equals(resultArr[1])) {
                                    retAts =  new  RetAtsB001OperBillQry(query.reqHeader);
                                    retAts.respCode = "0";
                                    retAts.respInfo = "总条数为0";
                                    retAts.writeBefore();
                                    break;
                                }
                                tmpTotalNum.put("recordCount", Integer.valueOf(resultArr[1]));//记录总条数
                            }
                            //计算正常循环体数量
                            int count=0;
                            int page=Integer.parseInt(getBankConfig().getValueAsString("pageSize"));//默认每页查询数
                            int sum=tmpNowReadStart*page;//当前页*页数
                            if(Integer.valueOf(resultArr[1])>sum){
                                count=Integer.parseInt(getBankConfig().getValueAsString("pageSize"));
                            }else {
                                count=Integer.valueOf(resultArr[1])-(tmpNowReadStart-1)*page;
                            }
                            //校验返回的循环体数量是否一致
                            if(count==resultArr.length-2){
                                //开始循环获取数据
                                for (int i=0;i<count;i++){
                                    String[] content=resultArr[i+2].replaceAll(" ","").split("\\|");
                                    RetAtsB001OperBillQryDetail detail = new RetAtsB001OperBillQryDetail();
                                    //电子票据号码
                                    detail.billNo=content[0];
                                    //票据类型 1-银承 2-商承
                                    detail.billType=getBankConfig().getMapKeyByValue("billTypeMapping",content[2]);
                                    //出票日(yyyy-MM-dd)
                                    detail.issDate=content[4];
                                    //到期日(yyyy-MM-dd)
                                    detail.dueDate=content[5];
                                    //电子票据金额
                                    detail.billAmt=content[3];
                                    //背书转让标识 1-可再转让 0-不得转让
                                    detail.transFlag=getBankConfig().getMapKeyByValue("transFlagMapping",content[6]);
                                    //承兑无条件支付委托 1-无条件支付 0-非条件支付
                                    detail.mustPay="";
                                    //出票人
                                    detail.drawName=content[7];
                                    //出票人组织代码
                                    detail.drawCode="";
                                    //出票人账号
                                    detail.drawAct=content[8];
                                    //出票人开户行行名
                                    detail.drawBnkName="";
                                    //出票人开户行行号
                                    detail.drawBnkCode=content[9];
                                    //承兑人名称
                                    detail.accpName=content[13];
                                    detail.accpCode="";
                                    //承兑人账号
                                    detail.accpAct=content[14];
                                    //承兑人开户行行名
                                    detail.accpBnkName="";
                                    //承兑人开户行行号
                                    detail.accpBnkCode=content[15];
                                    //收款人
                                    detail.payeeName=content[10];
                                    detail.payeeCode="";
                                    //收款人账号
                                    detail.payeeAct=content[11];
                                    //收款人开户行行名
                                    detail.payeeBnkName="";
                                    //收款人开户行行号
                                    detail.payeeBnkCode=content[12];
                                    //申请人
                                    detail.applyName=content[17];
                                    //申请人账号
                                    detail.applyAct=content[18];
                                    //申请人开户行行号
                                    detail.applyBnkCode=content[19];

                                    //交易明细流水
                                    detail.busiNo=content[1];
                                    //操作标志
                                    detail.busiType=query.detail.busiType;
                                    //查询类型
                                    detail.queryType=query.detail.queryType;
                                    //备注
                                    detail.memo="";
                                    //票据状态
                                    detail.billStatus=content[16];
                                    retAts.writeDetail(detail);
                                }
                            }else{
                                respCode="-1";
                                respInfo="返回数据丢失";
                                break;
                            }
                            //校验是否需要查询下一页
                            tmpNowReadNum += count;//已查询数
                            if (tmpTotalNum.get("recordCount") > tmpNowReadNum) {
                                tmpNowReadStart++;
                            }
                        } else {
                            respCode="-1";
                            respInfo=convertRespToBank(resultArr[0]);//获取银行返回信息"查询失败，银行返回码："+resultArr[0]
                            break;
                        }
                    } else {
                        respCode="-1";
                        respInfo=tmpStrRet[1];
                        break;
                    }
                }
            }
        }catch (Exception ex){
            ex.printStackTrace();
            respCode = "-1";
            respInfo = ex.getMessage();
        }
        if("-1".equals(respCode)){
            retAts = new RetAtsB001OperBillQry(query.reqHeader);
            retAts.respCode = "-1";
            retAts.respInfo  = respInfo;
            retAts.writeBefore();
        }
        retAts.writeEnd();
        return retAts;
    }

    /**
     * 票据操作明细查询
     */
    @Override
    public RetAtsB002BillTransQry D_B002_BillTrans_Query(ReqB002BillTransQry query) throws  Exception{
        RetAtsB002BillTransQry retAts = new RetAtsB002BillTransQry(query.reqHeader);
        RetAtsB002BillTransQryDetail detail=new RetAtsB002BillTransQryDetail();
        retAts.writeStart();
        //请求报文
        String sendInfo = MessageFormat.format("{0}#{1}#@@@@", "B208005", query.billNo);
        //请求银行
        String[] tmpStrRet = sendToBank(sendInfo);
        if (tmpStrRet[0].length() == 0) {
            //返回码
            String[] resultArr = tmpStrRet[1].split("#");
            if ("000000".equals(resultArr[0])) {
                if(resultArr.length==42){
                    retAts.respCode= "0";
                    retAts.respInfo= "";
                    //电子票据号??
                    detail.billNo=query.billNo;
                    //票据类型 1-银承 2-商承
                    detail.billType="";
                    //操作标志 1-出票 2-承兑 3-收票 4-背书转让 5-质押 6-解质押 7-出票保证 8-承兑保证 9-背书保证 10-贴现 11-回购式贴现赎回 12-提示付款 13-追索 14-同意清偿
                    detail.busiType="";
                    //    查询类型 1-申请 2-应答 3-撤回
                    detail.queryType="";
                    //背书转让标识 1-可再转让 0-不得转让
                    detail.transFlag=getBankConfig().getMapKeyByValue("transFlagMapping",resultArr[18]);

                    //申请日期
                    detail.applyDate=resultArr[1];
                    //操作日期
                    detail.respDate="";
                    //申请人
                    detail.applyName=resultArr[2];
                    //申请人组织机构代码
                    detail.applyCode=resultArr[5];
                    //申请人账号
                    detail.applyAct=resultArr[6];
                    //申请人开户行行名
                    detail.applyBnkName="";
                    //申请人开户行行号
                    detail.applyBnkCode=resultArr[7];

                    //收款人
                    detail.receName=resultArr[10];
                    //收款人组织机构代码
                    detail.receCode=resultArr[13];
                    //收款人人账号
                    detail.receAct=resultArr[14];
                    //收款人人开户行行名
                    detail.receBnkName=resultArr[15];
                    //收款人开户行行号
                    detail.receBnkCode=resultArr[17];

                    //备注
                    detail.memo="";
                    //交易合同号码
                    detail.contractNo=resultArr[27];
                    //支票号码
                    detail.invoiceNo=resultArr[28];
                    //保证人地址
                    detail.guarAddr="";
                    //贴现种类 1-买断式 2-回购式
                    detail.discType="RM00".equals(resultArr[22])?"1":"2";
                    //清算标记 1-线上清算 2-线下清算
                    detail.payType="SM00".equals(resultArr[20])?"1":"2";
                    //回购开放日
                    detail.repOpenDate=resultArr[23];
                    //回购截止日
                    detail.repDueDate=resultArr[24];
                    //贴现利率
                    detail.discRate=resultArr[21];
                    //贴现实付金额
                    detail.discAmt="";
                    //回购利率
                    detail.repRate=resultArr[25];
                    //回购实付金额
                    detail.repAmt=resultArr[26];
                    //提示付款金额
                    detail.proPayAmt="";
                    //入账账号
                    detail.actedAct="";
                    //入账行号
                    detail.actedBnkCode="";
                    //拒付理由代码 1--DC00 2--DC01 N--DC0(N-1) 99--DC09
                    detail.unPayCode="";
                    //保证类型 1-出票保证 2-承兑保证 3-背书保证
                    detail.guarType="";
                    //逾期原因说明
                    detail.overDueRea="";
                    //追索类型 1-拒付追索 2-非拒付追索
                    detail.recourseType=resultArr[38];
                    //追索金额
                    detail.recourseAmt=resultArr[40];
                    //追索理由代码（非拒付时） 1-承兑人被依法宣告破产 2-承兑人因违法被责令终止活动
                    detail.recourseCode="";
                }else {
                    retAts.writeRespCode("0");
                    retAts.writeRespInfo("返回记录为空");
                }
            }else {
                retAts.writeRespCode("-1");
                retAts.writeRespInfo(convertRespToBank(resultArr[0]));//获取银行返回信息"查询失败，银行返回码："+resultArr[0]
            }
        } else {
            retAts.writeRespCode("-1");
            retAts.writeRespInfo(tmpStrRet[1]);
        }
        retAts.writeDetail(detail);
        retAts.writeEnd();
        return retAts;
    }

    /**
     * 正面信息查询 已测
     */
    @Override
    public RetAtsB004BillFrontQry D_B004_BillFront_Query(ReqB004BillFrontQry query) throws  Exception{
        RetAtsB004BillFrontQry retAts = new RetAtsB004BillFrontQry(query.reqHeader);
        retAts.writeStart();
        String respCode = "";
        String respInfo ="";
        while (query.readRecord()) {
            //请求报文
            String sendInfo = MessageFormat.format("{0}#{1}#{2}#{3}#@@@@", "B208014", query.detail.billNo, "", "");
            //请求银行
            String[] tmpStrRet = sendToBank(sendInfo);
            if (tmpStrRet[0].length() == 0) {
                //返回码|票据正面
                //返回码
                String[] resultArr = tmpStrRet[1].trim().replaceAll("@","").replaceAll("\r","")
                        .replaceAll("\n","").split("#");
                if ("000000".equals(resultArr[0])) {
                    if(resultArr.length>=17){
                        retAts.respCode= "0";
                        retAts.respInfo= "";
                        retAts.billNo= resultArr[1];//电子票据
                        retAts.billType= getBankConfig().getMapKeyByValue("billTypeMapping",resultArr[2]);//票据类型 1-银承 2-商承
                        retAts.issDate= resultArr[3];//出票日
                        retAts.dueDate= resultArr[12];//到期日
                        retAts.billAmt= resultArr[11].contains(".")?resultArr[11]:resultArr[11]+".00";//电子票据金额
                        //查询背书转让标识和票据状态
                        String[] status=new String[2];
                        for(int i=0;i<4;i++){
                            status=getBillStatus(resultArr[1],getBankConfig().getMapKeyByValue("billTypeMapping",resultArr[2]),query.detail.actNum,i+"");
                            if(StringHelper.hasAnyChar(status[0])){
                                break;
                            }
                        }
                        if(StringHelper.isNullOrEmpty(status[0])){
                            status=getBillStatus(resultArr[1],getBankConfig().getMapKeyByValue("billTypeMapping",resultArr[2]),query.detail.actNum,"");
                        }
                        if(StringHelper.hasAnyChar(status[0])){
                            retAts.transFlag= getBankConfig().getMapKeyByValue("transFlagMapping",status[0]);//背书转让标识 1-可再转让 0-不得转让
                            retAts.mustPay= "";//承兑无条件支付委托 1-无条件支付 0-非条件支付
                            retAts.drawName= resultArr[4];//出票人
                            retAts.drawCode= "";//出票人组织代码
                            retAts.drawAct= resultArr[5];//出票人账号
                            retAts.drawBnkName= "";//出票人开户行行名
                            retAts.drawBnkCode= "";//出票人开户行行号
                            retAts.creditLv= "";//出票人信用等级
                            retAts.gradeAgent= "";//出票人信用评级机构
                            retAts.gradeDueDate= "";//出票人评级到期日
                            retAts.drGuarName= "";//出票保证人名称
                            retAts.drGuarAddr= "";//出票保证人地址
                            retAts.drGuarDate= "";//出票保证日期
                            retAts.accpName= resultArr[16];//承兑人名称
                            retAts.accpAct= "0";//承兑人账号
                            retAts.accpBnkName= resultArr[16];//承兑人开户行行名
                            retAts.accpBnkCode= "";//承兑人开户行行号
                            retAts.accpCredit= "";//承兑人信用等级
                            retAts.accpGrade= "";//承兑人评级机构
                            retAts.accpGradeDue= "";//承兑人评级到期日
                            retAts.apGuarName= "";//承兑保证人名称
                            retAts.apGuarAddr= "";//承兑保证人地址
                            retAts.apGuarDate= "";//承兑保证日期
                            retAts.payeeName= resultArr[7];//收款人名称
                            retAts.payeeAct= resultArr[8];//收款人账号
                            retAts.payeeBnkName= resultArr[9];//收款人开户行行名
                            retAts.payeeBnkCode= resultArr[10];//收款人开户行行号
                            retAts.billState= status[1];//票据状态
                        }else {
                            respCode = "-1";
                            respInfo ="查询票据状态或背书转让标识异常";
                        }
                    }else {
                        respCode = "-1";
                        respInfo ="返回字段缺失";
                    }
                }else {
                    respCode = "-1";
                    respInfo =convertRespToBank(resultArr[0]);//获取银行返回信息"查询失败，银行返回码："+resultArr[0]
                }
            } else {
                respCode = "-1";
                respInfo =tmpStrRet[1];
            }
        }
        if("-1".equals(respCode)){
            retAts = new RetAtsB004BillFrontQry(query.reqHeader);
            retAts.writeStart();
            retAts.respCode =respCode;
            retAts.respInfo = respInfo;
        }
        retAts.writeRetDetail();
        retAts.writeEnd();
        return retAts;
    }

    /**
     * 票据背面信息查询 已测
     */
    @Override
    public RetAtsB005BillBackQry D_B005_BillBack_Query(ReqB005BillBackQry query) throws Exception{
        RetAtsB005BillBackQry retAts = new RetAtsB005BillBackQry(query.reqHeader);
        retAts.writeStart();
        String respCode = "";
        String respInfo ="";
        while (query.readRecord()) {
            //请求报文
            String sendInfo = MessageFormat.format("{0}#{1}#{2}#{3}#@@@@", "B208014", query.detail.billNo, "", "");
            //请求银行
            String[] tmpStrRet = sendToBank(sendInfo);
            if (tmpStrRet[0].length() == 0) {
                //返回码
                String[] resultArr = tmpStrRet[1].trim().replaceAll("@","").replaceAll("\r","")
                        .replaceAll("\n","").split("#");
                if ("000000".equals(resultArr[0])) {
                    if(resultArr.length>=18) {
                        int n=17;
                        for(int i=0;i<(resultArr.length-n);i++){
                            RetAtsB005BillBackQryDetail detail = new RetAtsB005BillBackQryDetail();
                            //票据状态|申请人名称|被申请人名称|不得转让标识|申请日期|
                            String[] content = resultArr[i+n].split("\\|");
                            if (content.length==5) {
                                detail.respCode="0";
                                detail.respInfo="";
                                //电子票据号码
                                detail.billNo = query.detail.billNo;
                                //操作代码取值
                                /// 交易类型代码 2  承兑 3  收票 4  撤票 10  背书转让 11  贴现 12  回购式贴现赎回 13  转贴现 14  回购式转贴现赎回 15  再贴现 16  回购式再贴现赎回 25  央行卖出商业汇票 17  保证 18  质押 19  质押解除 20  提示付款 21  逾期提示付款 22  追索 23  追索同意清偿
                                detail.transCode = getTransCode(content[0]);
                                //申请人
                                detail.applyName = content[1].trim();
                                //接收人
                                detail.receName = content[2].trim();
                                //申请日期
                                detail.applyDate = content[4].trim();
                                //背书转让标识 1-可再转让 0-不得转让
                                detail.transFlag = getBankConfig().getMapKeyByValue("transFlagMapping", content[3].trim());
                            }
                            retAts.writeDetail(detail);
                        }
                    } else {
                        respCode = "0";
                        respInfo ="没有背面信息";
                    }
                }else {
                    respCode = "-1";
                    respInfo =convertRespToBank(resultArr[0]);//获取银行返回信息"查询失败，银行返回码："+resultArr[0]
                }
            } else {
                respCode = "-1";
                respInfo =tmpStrRet[1];
            }
        }
        if("-1".equals(respCode)){
            retAts = new RetAtsB005BillBackQry(query.reqHeader);
            retAts.writeStart();
            retAts.writeRespCode(respCode);
            retAts.writeRespCode(respInfo);
        }
        retAts.writeEnd();
        return retAts;
    }

    /**
     * 票据交易状态查询 已测
     */
    @Override
    public RetAtsB006BillStateQry D_B006_BillState_Qeury(ReqB006BillStateQry query)throws  Exception{
        RetAtsB006BillStateQry retAts  = new RetAtsB006BillStateQry(query.reqHeader);
        RetAtsB006BillStateQryDetail detail=new RetAtsB006BillStateQryDetail();
        retAts.writeStart();
        Connection conn= FGBiz.getLocalDbConn();
        while (query.readRecord()) {
            try{
                String seqNo="";//业务流水号
                Map<String, Object> selMap= JDBCHelper.execQuerySingle(conn,SELECTSEQ,new Object[]{query.detail.reqSeqID});
                if(selMap.size()>0){
                    seqNo=selMap.get("BANKREQSEQID").toString();
                }else {
                    retAts.writeRespCode("-1");
                    retAts.writeRespInfo("业务流水号关联异常");
                    retAts.writeEnd();
                    return retAts;
                }
                //请求报文
                String sendInfo = MessageFormat.format("{0}#{1}#{2}#{3}#{4}#{5}#@@@@","B308015",
                        seqNo, "1".equals(query.detail.busiType)?"":query.detail.billNo, query.detail.actNum, billTypeChange(query.detail.busiType,query.detail.operType), Format.Date10Format.format(new Date()));
                //请求银行
                String[] tmpStrRet = sendToBank(sendInfo);
                if (tmpStrRet[0].length() == 0) {
                    //返回码
                    String[] resultArr = tmpStrRet[1].trim().replaceAll("@","").replaceAll("\r","")
                            .replaceAll("\n","").split("#");
                    if ("EL1111".equals(resultArr[0].trim()) || "EL6001".equals(resultArr[0].trim())) {
                        detail.respCode="0";
                        if("EL1111".equals(resultArr[0].trim())){
                            detail.respInfo="无此流水";
                        }else {
                            detail.respInfo="调用通信出错";
                        }
                        //电子票据号码
                        detail.billNo=resultArr.length>2?resultArr[2]:query.detail.billNo;
                        //交易流水号
                        detail.reqSeqID=query.detail.reqSeqID;
                        //银行交易处理状态码
                        detail.transState=resultArr[0];
                        //银行交易信息码
                        detail.payInfoCode=detail.transState;
                    } else if("000000".equals(resultArr[0].trim())){
                        detail.respCode="0";
                        detail.respInfo=resultArr.length>3?resultArr[3]:"";
                        //电子票据号码
                        detail.billNo=resultArr.length>2?resultArr[2]:query.detail.billNo;
                        //交易流水号
                        detail.reqSeqID=query.detail.reqSeqID;
                        //银行交易处理状态码
                        detail.transState=resultArr[1];
                        //银行交易信息码
                        detail.payInfoCode=detail.transState;
                    } else {
                        detail.respCode="-1";
                        detail.respInfo=resultArr[0];
                    }
                } else {
                    retAts.writeRespCode("-1");
                    retAts.writeRespInfo(tmpStrRet[1]);
                }
            }catch(Exception e){
                e.printStackTrace();
                WriteBankLogLn("票据"+query.detail.billNo+"交易状态查询异常");
            }finally {
                conn.close();
            }
        }
        retAts.writeDetail(detail);
        retAts.writeEnd();
        return retAts;
    }

    /**
     * 可追索人查询 已测
     */
    @Override
    public RetAtsB007BillKzsrQry D_B007_BillKzsr_Query(ReqB007BillKzsrQry query) throws Exception{
        RetAtsB007BillKzsrQry retAts  = new RetAtsB007BillKzsrQry(query.reqHeader);
        retAts.writeStart();
        while (query.readRecord()) {
            //请求报文
            String sendInfo = MessageFormat.format("{0}#{1}#{2}#@@@@","B208002",query.detail.billNo,bankFront.corpNo);
            //请求银行
            String[] tmpStrRet = sendToBank(sendInfo);
            if (tmpStrRet[0].length() == 0) {
                //返回码
                String[] resultArr = tmpStrRet[1].trim().replaceAll("@","").replaceAll("\r","")
                        .replaceAll("\n","").split("#");
                if ("000000".equals(resultArr[0])) {
                    retAts.respCode="0";
                    retAts.respInfo="";
                    retAts.billNo=query.detail.billNo;
                    retAts.writeRespInfos();
                    for(int i=1;i<resultArr.length;i++){
                        RetAtsB007BillKzsrQryDetail detail=new RetAtsB007BillKzsrQryDetail();
                        String[] content=resultArr[i].split("\\|");
                        if (content.length == 3) {
                            //收款人名
                            detail.receName = content[0];
                            //收款人组织机构代码
                            detail.receCode = "";
                            //收款人人账号
                            detail.receAct = content[1];
                            //收款人人开户行行名
                            detail.receBnkName = "";
                            //收款人开户行行号
                            detail.receBnkCode = content[2];
                            retAts.writeDetail(detail);
                        } else {
                            retAts.writeRespCode("-1");
                            retAts.writeRespInfo("返回字段缺失");
                        }
                    }
                }else {
                    retAts.writeRespCode("-1");
                    retAts.writeRespInfo(convertRespToBank(resultArr[0]));//获取银行返回信息"查询失败，银行返回码："+resultArr[0]
                }
            } else {
                retAts.writeRespCode("-1");
                retAts.writeRespInfo(tmpStrRet[1]);
            }
        }
        retAts.writeEnd();

        return retAts;
    }

    /**
     * 历史票据查询
     */
    @Override
    public RetAtsB008HistoricalBillQry D_B008_HistoricalBillQuery(ReqB008HistoricalBillQry query) throws Exception{
        RetAtsB008HistoricalBillQry retAts=new RetAtsB008HistoricalBillQry(query.reqHeader);
        retAts.writeStart();
        retAts.respCode="-1";
        retAts.respInfo="银行暂不支持此操作";
        retAts.writeEnd();
        return retAts;
    }

    @Override
    public RetAtsB009DrawBillQry D_B009_DrawBillQuery(ReqB009DrawBillQry query) throws Exception {
        return null;
    }

    @Override
    public RetAtsB010ProtocolStateQry D_B010_ProtocolStateQuery(ReqB010ProtocolStateQry query) throws Exception {
        return null;
    }

    @Override
    public RetAtsB011TransFlagQry D_B011_TransFlagQuery(ReqB011TransFlagQry query) throws Exception {
        return null;
    }
}
